100 GOTO1000:REM ***** 16-BIT CALCULATION ***** 200 KK=PEEK(KEY):IFKK=NULLTHEN200 205 REM KEY PRESSED, USE VARS FOR SPEED 210 J=BB:Z=PEEK(H+BB):HH=PEEK(SHFT) 215 REM CUR-UP=7,CUR-LFT=2,RETURN=1 220 ONKKGOTO240,250,230,230,230,230,260 230 RETURN:REM NO VALID KEY, KEEP VALUE 240 J=INT((Z+BB)*K/CC):GOTO260 245 REM VRY FAST,LARGER FOR HIGHER VALS 250 J=K:REM MODERATE INCREMENT 260 Z=PEEK(H)+Z*XX+J*((HH=AA)-(HH>AA)) 265 REM H SET BY CALLER, ADD INCR 266 REM INCR IS POS IF SHIFT KEY DOWN 270 IFZZZTHENZ=ZZ 290 GOSUB930:REM POSITION CURSOR 295 REM PRINT VALUE IF PITCH OR FILTER 300 IFDV<>CCTHENPRINTZ"[157] ":GOTO320 305 REM PRINT % OF DUTY CYCLE 310 PRINTINT(Z/4.095)/10"[157]% " 315 REM PUT VALUE IN BUFFER 320 POKEH+BB,Z/XX:POKEH,Z-INT(Z/XX)*XX 330 IFDV>CCTHEN360:REM BRANCH FOR FLTR 335 REM PUT VAL IN SID, BACK FOR MORE 340 POKEYY,PEEK(H):POKEYY+BB,PEEK(H+BB) 350 GOTO200 355 REM FILTER IS ODD; 11-BIT VALUE 356 REM STORED 3 LOW, 8 HIGH 360 POKEYY,ZAND7:POKEYY+BB,Z/8 370 GOTO200:REM ***** 8-BIT CALCULATION ***** 400 KK=PEEK(KEY):IFKK=NULLTHEN400 405 REM KEY PRESSED, IS IT VALID? 410 ONKKGOTO430,430,420,420,420,420,430 415 REM NO, RETURN WITH VALUE KEPT 420 RETURN 430 HH=PEEK(SHFT):BB=SBUF+H 435 REM ADD INCREMENT (SAME FOR ANY 436 REM VALID KEY), POS IF SHIFT DOWN 440 Z=(PEEK(BB)ANDJ)/K+(HH=0)-(HH>0) 450 IFZ<0THENZ=0:REM MIN & MAX VALUES 460 IFZ>15THENZ=15 470 GOSUB930:PRINTZ"[157] ":REM POS & PRNT 475 REM MASK ON TO BYTE 480 Z=PEEK(BB)AND255-JORZ*K 485 REM INSERT & GO BACK FOR MORE 490 POKEBB,Z:POKESID+H,Z:GOTO400:REM ***** BIT DECODING ***** 700 YY=PEEK(SBUF+XX):REM VALUE OF BYTE 710 Z=INT((YYANDJ)/K):REM VAL OF BIT(S) 715 REM MASK VALUES SET BY CALLER 720 RETURN:REM ***** BIT ENCODING ***** 800 YY=YYAND255-JORZ*K:REM ENCODE 810 POKESBUF+XX,YY:REM SET BUFFER 820 POKESID+XX,YY:REM SET SID 830 RETURN:REM ***** CURSOR PLOTTER ***** 900 POKECX,WX%(CT)+CL:REM WORD ROW 910 POKECY,WY%(CT)+OFS:REM & COLUMN 920 GOTO950 930 POKECX,VX%(CT)+CL:REM VALUE ROW 940 POKECY,VY%(CT):REM & COLUMN 950 SYSMOVE:RETURN:REM MOVE CURSOR 996 REM ** MAIN ROUTINE ** 1000 GOSUB 50000:REM INITIALIZE ***** KEY INPUT ***** 1100 KK=PEEK(KEY):IFKK=NULLTHEN1100 1105 REM KEY PRESSED, IF SHIFT IS 1106 REM DOWN, SKIP ENTRY LEVEL CALC 1110 HH=PEEK(SHFT):IFHH=1THEN1500 1115 REM ENTRY LEVEL INTO VOICES? 1120 IFKKF5THEN1500 1125 REM CHANGE ENTRY LEVEL & CLEAR 1130 EL=KK-4:DV=-1:GOSUB53000:GOTO1100 1496 REM ***** KEY DISPATCH ***** 1500 IFKK=FTHEN2000:REM FREQUENCY 1510 IFKK=PTHEN2000:REM PULSE WIDTH 1520 IFKK=ATHEN3000:REM ATTACK 1530 IFKK=DTHEN3000:REM DECAY 1540 IFKK=STHEN3000:REM SUSTAIN 1550 IFKK=RTHEN3000:REM RELEASE 1560 IFKK=WTHEN4000:REM WAVEFORM 1570 IFKK=GTHEN4000:REM GATE 1580 IFKK=ITHEN4000:REM RING 1590 IFKK=YTHEN4000:REM SYNC 1600 IFKK=QTHEN2000:REM FILTER FREQ 1610 IFKK=NTHEN3000:REM RESONANCE 1620 IFKK=VTHEN3000:REM VOLUME 1630 IFKK=MTHEN5000:REM MODE 1640 IFKK=N1THEN5000:REM ASSIGN 1650 IFKK=N2THEN5000 1660 IFKK=N3THEN5000 1670 IFKK=XTHEN5000 1680 IFKK=OTHEN6000:REM OSC3 1690 IFKK=ETHEN6000:REM ENV3 1700 IFKK=TTHEN5000:REM 3 OFF 1705 REM SPECIAL FUNCTIONS 1710 IFKK=F1THENGOSUB7000:GOTO1100 1720 IFKK=F3THENGOSUB7000:GOTO1100 1730 IFKK=F5THENGOSUB7000:GOTO1100 1740 IFKK<>F7ORHH=0THEN1800:REM END? 1750 GETA$:IFA$<>""THEN1750:REM CLR BUF 1760 POKESID+24,0:SYSCS:END:REM END 1800 DV=-1:GOSUB53020:REM NO VALID KEY 1810 GOSUB52000:GOTO1100:REM OOPS ***** 16-BIT EVALUATION ***** 2000 DV=1:IFKK=PTHENDV=2 2010 IFKK=QTHENDV=12 2015 REM DV:1=VOICE FREQ, 2=PLS WDTH 2016 REM 12=FILTER FREQ, CLEAR OLD 2017 REM VARS USED FOR SPEED 2018 REM ZZ=MAX VAL, H=SID REG 2020 GOSUB53020:XX=256:AA=0:BB=1:CC=2 2030 K=29:H=0:ZZ=65535:J=7 2040 IFDV=2THENZZ=4095:H=2 2050 IFDV=12THENZZ=2047:H=21:J=0 2055 REM PRE-CALCULATE BUFFER & SID 2056 REM ENTRY POINTS 2060 YY=SID+EL*J+H:H=SBUF+EL*J+H 2065 REM CALC & DISPLAY VALUES 2066 REM ONCE A NON-VALID KEY IS FOUND 2067 REM IN SUBROUTINE, EXIT WITH KEY 2068 REM VALUE INTACT 2070 GOSUB200:GOTO1110:REM ***** 8-BIT EVALUATION ***** 3000 DV=4:H=EL*7+5:J=240:K=16:REM ATCK 3005 REM DECAY, SUSTAIN, RELEASE? 3010 IFKK=DTHENDV=5:J=15:K=1 3020 IFKK=STHENDV=6:H=EL*7+6 3030 IFKK=RTHENDV=7:H=EL*7+6:J=15:K=1 3035 REM RESONANCE OR VOLUME? 3040 IFKK=NTHENDV=13:H=23 3050 IFKK=VTHENDV=14:H=24:J=15:K=1 3055 REM CLEAR, CALC & DISPLAY VALUES 3056 REM WHEN NON-VALID KEY PRESSED, 3057 REM RETURN WITH VALUE INTACT 3060 GOSUB53020:GOSUB400:GOTO1110:REM ***** CTRL BYTE CALCULATION ***** 4000 DV=-1:GOSUB53020:REM CLEAR 4005 REM SET MASK VALUES 4010 XX=4+EL*7:DV=3:J=240:REM WAVEFORM 4020 IFKK=GTHENDV=8:J=1:REM GATE 4030 IFKK=ITHENDV=9:J=4:REM RING 4040 IFKK=YTHENDV=10:J=2:REM SYNC 4050 K=J:IFJ=240THENK=16 4055 REM GO GET VALUE FROM SID BUFFER 4056 REM BRANCH IF WAVEFORM 4060 GOSUB700:IFDV=3THEN4110 4066 REM TOGGLE VALUE 4070 Z=-(Z=0):CL=EL*5:CT=DV 4080 IFZ=1THENPRINT"";:REM HIGHLIGHT 4090 GOSUB53070:GOTO4190:REM DISPLAY 4100 REM 4105 REM INC 0->1,1->2,2->4,4->8,8->0 4110 Z=(Z*2-(Z=0))*-(Z<8) 4120 CT=DV:CL=EL*5:GOSUB930:REM MVE CRS 4125 REM DISPLAY WAVEFORM 4130 A$="-":IFZ=1THENA$="T 4140 [139]Z[178]2[167]A$[178]"S 4150 IFZ=4THENA$="P 4160 [139]Z[178]8[167]A$[178]"N 4170 PRINTA$ 4180 REM 4190 GOSUB800:GOTO1100:REM STORE & RTRN ***** FILT/MODE CALCULATION ***** 5000 DV=-1:GOSUB53020:REM CLEAR OLD 5010 DV=15:CT=DV:CL=0:REM MODE 5015 REM FILTER ASSIGNMENT? 5020 IFKK=N1THENDV=16:H=1:GOTO5500 5030 IFKK=N2THENDV=17:H=2:GOTO5500 5040 IFKK=N3THENDV=18:H=4:GOTO5500 5050 IFKK=XTHENDV=19:H=8:GOTO5500 5055 REM 3 OFF? 5060 IFKK=TTHENDV=22:GOTO5200 5070 REM 5075 REM MODE INCREMENT 5080 XX=24:J=112:K=16:GOSUB700 5085 REM INCR 0->1,1->2,2->4,4->0 5086 REM PROGRAM MODIFICATION POSSIBLE 5087 REM TO ALLOW MORE THAN ONE MODE 5088 REM AT THE SAME TIME 5090 Z=(Z*2-(Z=0))*-(Z<4) 5100 GOSUB930:REM MOVE CURSOR 5110 A$=" -":IFZ=1THENA$="LP 5120 [139]Z[178]2[167]A$[178]"BP 5130 IFZ=4THENA$="HP 5140 [153]A$:[137]5550:[143] DISPLAY 5150 [143] 5155 [143] TURN 3 OFF 5200 CT[178]DV:XX[178]24:J[178]128:K[178]1:[141]700 5205 [143] MASK & TOGGLE 5210 ZZ[178]128[172][171]((Z[175]J)[178]0):H[178]1:[137]5520 5220 [143] 5225 [143] ASSIGN FILTER 5500 CT[178]DV:XX[178]23:J[178]15:K[178]1:[141]700 5510 ZZ[178]H[172][171]((Z[175]H)[178]0):[143] MASK & TOGGLE 5520 [139]ZZ[177]0[167][153]""; 5530 [141]53090:[143] DISPLAY 5540 Z[178]Z[175]J[171]H[176]ZZ 5550 [141]800:[137]1100:[143] STORE & RTRN ***** I/O INSERT ***** 6000 DV[178][171]1:[141]53020:[143] CLEAR 6005 [143] DEFAULT TO OSC 6010 H[178]OS:CT[178]20:CL[178]0:[139]KK[178]O[167]6030 6015 [143] ENVELOPE 6020 H[178]EN:CT[178]21 6030 J[178][194](H):[143] READ VALUE 6035 [143] VALUE SWITCH 6036 [143] EITHER 255 (OFF),0 (VOICE 1, 6037 [143] LOW),1 (VOICE 1, HIGH), OR 22 6038 [143] (FILTER FREQUENCY, HIGH) 6040 J[178][171](J[178]0)[171]22[172](J[178]1)[171]255[172](J[178]22) 6050 [151]H,J:[141]930:[143] SAVE & MOVE 6055 [143] CALCULATE DISPLAY 6060 J[178]1[171](J[177]0)[171](J[177]1)[171](J[177]22) 6070 [153][202]("LHF-",J,1):[137]1100 6996 [143] ***** FUNCTION KEYS ***** 7000 DV[178][171]1:[141]53020:[143] CLEAR 7005 [143] CANNOT ARRIVE HERE UNLESS 7006 [143] SHIFT KEY WAS PRESSED, SO 7007 [143] F1=F2,F3=F4,F5=F6 7010 H[178]0:CT[178]8:J[178]1:K[178]1:[143] DEFAULT 7015 [143] F1(F2)=TOGGLE, F3(F4)=ALL OFF 7020 [139]KK[178]F1[176]KK[178]F3[167]7100 7025 [143] F5(F6)=ON THEN OFF 7026 [143] Z=READ VALUE, SET TO 1 7027 [143] WILL CAUSE A TOGGLE TO 0 7028 [143] H SERVES TO ADJUST Z 7030 H[178]1:[141]7100 7040 H[178]2 7095 [143] VOICE GATES AT SID+4,11,18 7100 [129]XX[178]4[164]18[169]7 7105 :[143] IF F3, SET TO TURN OFF 7110 :[141]700:[139]KK[178]F3[167]Z[178]1 7115 :[143] ADJUST FOR F5 7120 :[139]H[177]0[167]Z[178]H[171]1 7125 :[143] CALCULATE DISPLAY ROW 7130 :CL[178][171]5[172](XX[178]11)[171]10[172](XX[178]18) 7135 :[143] DISPLAY AS ON/OFF 7140 :[145](Z[179][177]1)[170]2[141]53060,53070 7150 :Z[178][171](Z[178]0):YY[178]YY[175]254[176]Z 7155 :[143] SAVE IN BUFFER 7160 :[151]SBUF[170]XX,YY 7170 [130] 7175 [143] MOVE TO SID QUICKLY 7180 [129]XX[178]4[164]18[169]7 7190 :[151]SID[170]XX,[194](SBUF[170]XX) 7200 [130]:[142]:[143] ** INITIALIZE ** 49995 [143] * PUT IN SYSTEM ROUTINES * 49996 [143] * CURSOR PLOT ROUTINE * 50000 MOVE[178]679:CX[178]251:CY[178]252 50010 [129]XX[178]MOVE[164]MOVE[170]7 50020 :[135]YY:[151]XX,YY 50030 [130]:[143] INTERRUPT ROUTINE 50040 [129]XX[178]712[164]760 50050 :[135]YY:[151]XX,YY 50060 [130]:[143] ***** VARIABLE ASSIGNMENT ***** 50100 KEY[178]203:SHFT[178]653:NULL[178]64 50105 [143] PEEK(KEY)=VAL OF CURRENT 50106 [143] KEY DOWN, PEEK(SHFT)>0 IF 50107 [143] SHIFT,C=,OR CTRL PRESSED 50108 [143] PEEK(KEY)=NULL MEANS NO KEY 50110 UP[178]7:FA[178]2:LO[178]1:XX[178]0:YY[178]0:ZZ[178]0:Z[178]0 50115 [143] UP=CURSOR UP/DOWN=SLOW 50116 [143] FA=CRSR LFT/RGHT=MODERATE 50117 [143] LO=RETURN=FAST 50118 [143] NO SHIFT=DOWN, SHIFT=UP 50120 KK[178]0:HH[178]0:H[178]0:J[178]0:K[178]0:DV[178]0:CT[178]0 50125 [143] KK HOLDS CURRENT KEY VALUE 50126 [143] HH>0 IF SHIFT DOWN 50127 [143] DV,CT,CL ARE DISPLAY VALUES 50130 CL[178]0:AA[178]0:BB[178]0:CC[178]0:SID[178]54272 50135 [143] OP=MOVE INTERRUPT,CS=RESTORE 50140 SBUF[178]MOVE[170]8:OP[178]712:CS[178]725 50145 [143] HIGHLIGHTED KEY VALUES 50150 F1[178]4:F3[178]5:F5[178]6:F7[178]3 50160 F[178]21:P[178]41:W[178]9:A[178]10:D[178]18:S[178]13:R[178]17 50170 G[178]26:I[178]33:Y[178]25:Q[178]62:N[178]39:M[178]36 50180 V[178]31:N1[178]56:N2[178]59:N3[178]8 50185 [143] EN,OS USED IN I/O 50190 X[178]23:O[178]38:E[178]14:T[178]22:EN[178]254:OS[178]253 50196 [143] ***** READ SCREEN DATA ***** 50200 [134]WX%(22),WY%(22):[143] WORD X,Y 50210 [134]VX%(22),VY%(22):[143] VALUE X,Y 50220 [134]WRD$(22):[143] DISPLAY STRINGS 50230 [129]XX[178]0[164]22 50240 :[135]WX%(XX),WY%(XX) 50250 :[135]VX%(XX),VY%(XX) 50260 :[135]WRD$(XX) 50270 [130]:[143] ***** DISPLAY SCREEN ***** 50300 [153]"LOADWAITCONT SID EDITOR - PRESS A HIGHLIGHTED KEY 50310 PRINT"CRSR:[U/D]=SLOW,[L/R]=MED, [RETURN]=FAST 50320 [129]XX[178]0[164]10[169]5:[143] VOICES 1-3 50325 :[143] 0=F1,5=F3,10=F5 50330 :A$[178][201]([196](2[172]XX[173]5[170]1),1) 50335 :[143] MOVE CURSOR 50340 :CT[178]0:CL[178]XX:OFS[178][171]3:[141]900 50345 :[143] PRINT "VOICE" 50350 :[153]"F"A$"CONT "WRD$(0)XX[173]5[170]1 50355 :[143] Z DETERMINES DISPLAY TYPE 50360 :[129]YY[178]1[164]10:Z[178]1[171](YY[179]8)[171](YY[178]3) 50370 : CT[178]YY:OFS[178]0:[141]900 50380 : [153]WRD$(YY)" "[202](" 0-",Z,1) 50390 :[130] 50400 [130] 50410 [143] 50415 [143] FILTER & VOLUME STUFF 50420 CT[178]11:CL[178]0:[141]900 50430 [153]WRD$(11) 50440 [129]XX[178]12[164]22:[139]XX[179][177]16[167]50460 50445 :[143] ADDITIONAL PROMPT 50450 :[153]" ASSIGN FILTER 50455 :REM A$=DEFAULT DISPLAY 50460 :A$="":IFXX<15THENA$=" 0 50470 :[139]XX[178]15[176]XX[178]20[176]XX[178]21[167]A$[178]" - 50480 :CT=XX:GOSUB900:REM MOVE CURSOR 50490 :PRINTWRD$(XX)A$ 50500 NEXT:PRINT 50510 PRINT" F2[154]=TOGGLE F4[154]=ALL OFF F6[154]=ON/OFF F8[154]=QUIT"; 50515 REM DISPLAY VALUES DEFAULT 50520 EL=0:OEL=EL:DV=-1:ODV=DV 50598 REM ***** INSERT I/O INTO INTERRUPT ***** 50600 POKEEN,255:POKEOS,255:SYSOP 50996 REM ***** CLEAR SID & BUFFER ***** 51000 FORXX=SIDTOSID+28 51020 : POKEXX,0 51030 : POKESBUF+XX-SID,0 51040 NEXT 51050 RETURN:REM ***** ERROR BUZZ **** 52000 POKESID+23,0:REM NO FILTER 52010 POKESID+24,15:REM FULL VOL 52020 POKESID+1,10:REM VOICE 1 52030 POKESID+5,0:REM NO A/D 52040 POKESID+6,240:REM FULL SUS 52050 POKESID+4,0:REM GATE OFF 52060 POKESID+4,33:REM SAW ON 52070 FORXX=1TO80:NEXT:REM DELAY 52075 REM RESTORE OLD VALUES 52080 POKESID+23,PEEK(SBUF+23) 52090 POKESID+24,PEEK(SBUF+24) 52100 POKESID+1,PEEK(SBUF+1) 52110 POKESID+5,PEEK(SBUF+5) 52120 POKESID+6,PEEK(SBUF+6) 52130 POKESID+4,PEEK(SBUF+4) 52140 RETURN:REM ***** HIGHLIGHT CURRENT ENTRY ***** 52995 REM LINE 53000 CLEARS OLD VOICE 52996 REM LINE 53010 HIGHLIGHTS NEW 52997 REM LINE 53020 CLEARS OLD ENTRY 52998 REM LINE 53040 HIGHLIGHTS NEW 52999 REM 53000 CT=0:CL=5*OEL*-(CT<11):GOSUB53070 53005 REM CL=ROW OFFSET 53010 CL=5*EL*-(DV<11):GOSUB53060 53020 CT=ODV:CL=5*OEL*-(CT<11) 53030 GOSUB53070 53040 OEL=EL:ODV=DV 53050 CT=ODV:CL=5*OEL*-(CT<11) 53060 PRINT""; 53065 REM NO CHANGE FOR THESE VALUES 53066 REM GATE, RING, ETC 53070 IFCT<0ORCT>14THEN53110 53080 IFCT=3ORCT=11THEN53110 53090 GOSUB900:REM PLOT 53100 PRINT WRD$(CT) 53110 PRINT"[146]";:RETURN:REM ***** PROGRAM DATA ***** 59998 REM CURSOR MOVE ROUTINE 59999 REM 60000 DATA24,166,251,164,252,76,240,255 60096 REM 60097 REM 60098 REM INTERRUPT ROUTINE 60099 REM 60100 DATA120,169,226,141,20,3,169 60110 DATA2,141,21,3,88,96,120,169 60120 DATA49,141,20,3,169,234,141 60130 DATA21,3,88,96,166,253,48,6 60140 DATA173,27,212,157,0,212,166 60150 DATA254,48,6,173,28,212,157 60160 DATA0,212,76,49,234 62992 REM 62993 REM 62994 REM SCREEN DISPLAY DATA 62995 REM 62996 REM WORD START X, WORD START Y, 62997 REM VALUE START X, VALUE START Y, 62998 REM WORD 62999 REM 63000 DATA3,4,3,4,VOICE 63010 DATA3,13,3,23,"F[154]REQUENCY: 63020 [131]4,13,4,23,"PCONTLS WIDTH: 63030 DATA5,14,5,24,"W[154]AVEFORM: 63040 [131]3,30,3,37,"ACONTTTACK: 63050 DATA4,31,4,37,"D[154]ECAY: 63060 [131]5,29,5,37,"SCONTUSTAIN: 63070 DATA6,29,6,37,"R[154]ELEASE: 63080 [131]6,13,6,13,"GCONTATE 63090 DATA6,18,6,18,"RI[154]NG 63100 [131]6,23,6,23,"SYCONTNC 63110 DATA19,1,19,1,FILTER/OUT 63120 DATA19,13,19,23,"FREQ[154]UENCY: 63130 [131]20,13,20,23,"RESONCONTANCE: 63140 DATA19,30,19,37,"V[154]OLUME: 63150 [131]20,32,20,37,"MCONTODE: 63160 DATA21,27,21,27,"1[154] 63170 [131]21,29,2,29,"2CONT 63180 DATA21,31,21,31,"3[154] 63190 [131]21,33,21,33,"EXCONTT 63200 DATA22,13,22,18,"O[154]SC3 63210 [131]22,21,22,26,"ECONTNV3 63220 DATA22,29,22,29,"T[154]URNOFF 3 63230 [143] *** END OF PROGRAM ***